﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections.ObjectModel;
using HellCook.Model;
using System.Data.SqlClient;

namespace HellCook.DataAccess
{
    public static class ListaDeCompra_AdministradorBaseDeDatos
    {
        private static string PathDataBase = "Data Source=.\\SQLEXPRESS; Initial Catalog=HellCook_DataBase; Integrated Security=true";


        public static void ActualizarListaDeCompraDiaria()
        {
            Collection<Ingrediente> Lista = HellCook.DataAccess.Ingrediente_AdministradorBaseDeDatos.ObtenerIngredienteCercanosALaFechaDeVencimiento();
            bool SeVio = SeVioLaListaDeCompraElDiaDeHoy();

            if (Lista != null && SeVio == false)
            {
                for (int Ptr = 0; Ptr < Lista.Count; Ptr++)
                {
                    SqlConnection SQLConnection;
                    SQLConnection = new SqlConnection(PathDataBase);

                    SqlCommand SQLCommand = SQLConnection.CreateCommand();
                    SQLCommand.CommandText = "INSERT INTO [ListaDeCompras] (Tipo_De_Lista, Codigo_Ingrediente, Fecha_Lista_De_Compra, Cantidad_A_Comprar, Estado) VALUES(@Tipo, @Codigo, @Fecha, @Cantidad, @EstadoActual)";

                    SQLCommand.Parameters.AddWithValue("Tipo", "Diario");
                    SQLCommand.Parameters.AddWithValue("Codigo", Lista[Ptr].Codigo);
                    SQLCommand.Parameters.AddWithValue("Fecha", DateTime.Now);
                    SQLCommand.Parameters.AddWithValue("Cantidad", "10");
                    SQLCommand.Parameters.AddWithValue("EstadoActual", "En_Espera");

                    try
                    {
                        SQLConnection.Open();
                        int Result = SQLCommand.ExecuteNonQuery();
                    }
                    catch (Exception)
                    {
                    }
                    finally
                    {
                        if (SQLConnection.State == System.Data.ConnectionState.Open)
                        {
                            SQLConnection.Close();
                        }
                    }
                }
            }
        }

        public static void ActualizarListaDeCompraMensual()
        {
            Collection<Ingrediente> Lista = HellCook.DataAccess.Ingrediente_AdministradorBaseDeDatos.ObtenerIngredienteConCantidadMaxima();
            bool SeVio = SeVioLaListaDeCompraMensual();

            if (Lista != null && SeVio == false && DateTime.Today.Day == 1)
            {
                for (int Ptr = 0; Ptr < Lista.Count; Ptr++)
                {
                    SqlConnection SQLConnection;
                    SQLConnection = new SqlConnection(PathDataBase);

                    SqlCommand SQLCommand = SQLConnection.CreateCommand();
                    SQLCommand.CommandText = "INSERT INTO [ListaDeCompras] (Tipo_De_Lista, Codigo_Ingrediente, Fecha_Lista_De_Compra, Cantidad_A_Comprar, Estado) VALUES(@Tipo, @Codigo, @Fecha, @Cantidad, @EstadoActual)";

                    SQLCommand.Parameters.AddWithValue("Tipo", "Mensual");
                    SQLCommand.Parameters.AddWithValue("Codigo", Lista[Ptr].Codigo);
                    SQLCommand.Parameters.AddWithValue("Fecha", DateTime.Now);
                    SQLCommand.Parameters.AddWithValue("Cantidad", Lista[Ptr].Cantidad_Maxima);
                    SQLCommand.Parameters.AddWithValue("EstadoActual", "En_Espera");

                    try
                    {
                        SQLConnection.Open();
                        int Result = SQLCommand.ExecuteNonQuery();
                    }
                    catch (Exception)
                    {
                    }
                    finally
                    {
                        if (SQLConnection.State == System.Data.ConnectionState.Open)
                        {
                            SQLConnection.Close();
                        }
                    }
                }
            }
        }

        public static void ActualizarListaDeCompraSemanal()
        {
            Collection<MenuDeLaSemana> Lista = HellCook.DataAccess.MenuDeLaSemana_AdministradorBaseDeDatos.ObtenerMenuSemanal();
            bool SeVio = SeVioLaListaDeCompraSemanal();

            Collection<NodoCantidadIngrediente> ListaDeIngredientes = new Collection<NodoCantidadIngrediente>();
            if (Lista != null)
            {
                for (int Ptr_I = 0; Ptr_I < Lista.Count; Ptr_I++)
                {
                    Collection<NodoCantidadIngrediente> IngredientesDeLaReceta = HellCook.DataAccess.Receta_AdministradorBaseDeDatos.ObtenerUnaRecetaPorCodigo(Lista[Ptr_I].Codigo_Receta.ToString()).Lista_Ingredientes;
                    for (int Ptr_J = 0; Ptr_J < IngredientesDeLaReceta.Count; Ptr_J++)
                    {
                        ListaDeIngredientes.Add(IngredientesDeLaReceta[Ptr_J]);
                    }
                }

                for (int Ptr_I = 0; Ptr_I < ListaDeIngredientes.Count; Ptr_I++)
                {                 
                    for (int Ptr_J = Ptr_I; Ptr_J < ListaDeIngredientes.Count; Ptr_J++)
                    {
                        if (Ptr_I != Ptr_J)
                        {
                            if (ListaDeIngredientes[Ptr_I].Codigo == ListaDeIngredientes[Ptr_J].Codigo)
                            {
                                ListaDeIngredientes[Ptr_I].Cantidad = ListaDeIngredientes[Ptr_I].Cantidad + ListaDeIngredientes[Ptr_J].Cantidad;
                                ListaDeIngredientes.RemoveAt(Ptr_J);
                                Ptr_J--;
                            }
                        }
                    }
                }
            }
            
            if (ListaDeIngredientes != null && SeVio == false && String.Equals(DateTime.Today.DayOfWeek.ToString(), "Sunday") == true)
            {
                for (int Ptr = 0; Ptr < ListaDeIngredientes.Count; Ptr++)
                {
                    SqlConnection SQLConnection;
                    SQLConnection = new SqlConnection(PathDataBase);

                    SqlCommand SQLCommand = SQLConnection.CreateCommand();
                    SQLCommand.CommandText = "INSERT INTO [ListaDeCompras] (Tipo_De_Lista, Codigo_Ingrediente, Fecha_Lista_De_Compra, Cantidad_A_Comprar, Estado) VALUES(@Tipo, @Codigo, @Fecha, @Cantidad, @EstadoActual)";


                    SQLCommand.Parameters.AddWithValue("Tipo", "Semanal");
                    SQLCommand.Parameters.AddWithValue("Codigo", ListaDeIngredientes[Ptr].Codigo);
                    SQLCommand.Parameters.AddWithValue("Fecha", DateTime.Now);                   
                    SQLCommand.Parameters.AddWithValue("Cantidad", ListaDeIngredientes[Ptr].Cantidad);
                    SQLCommand.Parameters.AddWithValue("EstadoActual", "En_Espera");

                    try
                    {
                        SQLConnection.Open();
                        int Result = SQLCommand.ExecuteNonQuery();
                    }
                    catch (Exception)
                    {
                    }
                    finally
                    {
                        if (SQLConnection.State == System.Data.ConnectionState.Open)
                        {
                            SQLConnection.Close();
                        }
                    }
                }
            }
        }





        public static bool SeVioLaListaDeCompraElDiaDeHoy()
        {
            bool Resultado = false;
            SqlDataReader ReaderInfo = null;

            SqlConnection SQLConnection;
            SQLConnection = new SqlConnection(PathDataBase);

            SqlCommand SQLCommand = SQLConnection.CreateCommand();
            SQLCommand.CommandText = "SELECT * FROM [ListaDeCompras] WHERE Estado = 'En_Espera' AND Fecha_Lista_De_Compra = @Fecha AND Tipo_De_Lista = 'Diario'";

            SQLCommand.Parameters.AddWithValue("Fecha", DateTime.Today);

            try
            {
                SQLConnection.Open();
                ReaderInfo = SQLCommand.ExecuteReader();

                while (ReaderInfo.Read())
                {
                    Resultado = true;
                }
            }
            catch (Exception)
            {
                Resultado = true;
            }
            finally
            {
                if (SQLConnection.State == System.Data.ConnectionState.Open)
                {
                    SQLConnection.Close();
                }
            }
            return (Resultado);
        }

        public static bool SeVioLaListaDeCompraSemanal()
        {
            bool Resultado = false;
            SqlDataReader ReaderInfo = null;

            if (!String.Equals(DateTime.Today.DayOfWeek.ToString(), "Sunday"))
            {
                return (true);
            }

            SqlConnection SQLConnection;
            SQLConnection = new SqlConnection(PathDataBase);

            SqlCommand SQLCommand = SQLConnection.CreateCommand();
            SQLCommand.CommandText = "SELECT * FROM [ListaDeCompras] WHERE Estado = 'En_Espera' AND Tipo_De_Lista = 'Semanal'";

            try
            {
                SQLConnection.Open();
                ReaderInfo = SQLCommand.ExecuteReader();

                while (ReaderInfo.Read())
                {
                    Resultado = true;
                }
            }
            catch (Exception)
            {
                Resultado = true;
            }
            finally
            {
                if (SQLConnection.State == System.Data.ConnectionState.Open)
                {
                    SQLConnection.Close();
                }
            }
            return (Resultado);
        }

        public static bool SeVioLaListaDeCompraMensual()
        {
            bool Resultado = false;
            SqlDataReader ReaderInfo = null;

            SqlConnection SQLConnection;
            SQLConnection = new SqlConnection(PathDataBase);

            SqlCommand SQLCommand = SQLConnection.CreateCommand();
            SQLCommand.CommandText = "SELECT * FROM [ListaDeCompras] WHERE Estado = 'En_Espera' AND Tipo_De_Lista = 'Mensual'";            

            try
            {
                SQLConnection.Open();
                ReaderInfo = SQLCommand.ExecuteReader();

                while (ReaderInfo.Read())
                {
                    Resultado = true;
                }
            }
            catch (Exception)
            {
                Resultado = true;
            }
            finally
            {
                if (SQLConnection.State == System.Data.ConnectionState.Open)
                {
                    SQLConnection.Close();
                }
            }
            return (Resultado);
        }




        public static void FinalizarLasListaDeComprasDeAyer()
        {
            SqlConnection SQLConnection;
            SQLConnection = new SqlConnection(PathDataBase);

            SqlCommand SQLCommand = SQLConnection.CreateCommand();            
            SQLCommand.CommandText = "UPDATE [ListaDeCompras] SET Estado='Finalizado' WHERE Fecha_Lista_De_Compra < @Fecha";

            SQLCommand.Parameters.AddWithValue("Fecha", DateTime.Today.ToString());

            try
            {
                SQLConnection.Open();
                int Result = SQLCommand.ExecuteNonQuery();
            }
            catch (Exception)
            {
            }
            finally
            {
                if (SQLConnection.State == System.Data.ConnectionState.Open)
                {
                    SQLConnection.Close();
                }
            }
        }

        public static void FinalizarLasListaDeComprasSemanal()
        {
            if (!String.Equals(DateTime.Today.DayOfWeek.ToString(), "Sunday"))
            {
                SqlConnection SQLConnection;
                SQLConnection = new SqlConnection(PathDataBase);

                SqlCommand SQLCommand = SQLConnection.CreateCommand();
                SQLCommand.CommandText = "UPDATE [ListaDeCompras] SET Estado='Finalizado' WHERE Tipo_De_Lista = 'Semanal'";                

                try
                {
                    SQLConnection.Open();
                    int Result = SQLCommand.ExecuteNonQuery();
                }
                catch (Exception)
                {
                }
                finally
                {
                    if (SQLConnection.State == System.Data.ConnectionState.Open)
                    {
                        SQLConnection.Close();
                    }
                }
            }
        }

        public static void FinalizarLasListaDeComprasMensual()
        {
            if (DateTime.Today.Day != 1)
            {
                SqlConnection SQLConnection;
                SQLConnection = new SqlConnection(PathDataBase);

                SqlCommand SQLCommand = SQLConnection.CreateCommand();
                SQLCommand.CommandText = "UPDATE [ListaDeCompras] SET Estado='Finalizado' WHERE Tipo_De_Lista = 'Mensual'";
                
                try
                {
                    SQLConnection.Open();
                    int Result = SQLCommand.ExecuteNonQuery();
                }
                catch (Exception)
                {
                }
                finally
                {
                    if (SQLConnection.State == System.Data.ConnectionState.Open)
                    {
                        SQLConnection.Close();
                    }
                }
            }
        }




        public static Collection<ListaDeCompras> ObtenerListaDeCompraDiaria()
        {
            Collection<ListaDeCompras> ListaDeCompras = null;
            SqlDataReader ReaderInfo = null;

            SqlConnection SQLConnection;
            SQLConnection = new SqlConnection(PathDataBase);

            SqlCommand SQLCommand = SQLConnection.CreateCommand();
            SQLCommand.CommandText = "SELECT * FROM [ListaDeCompras] WHERE Tipo_De_Lista = @Tipo AND Fecha_Lista_De_Compra = @Fecha AND Estado <> 'Finalizado'";

            SQLCommand.Parameters.AddWithValue("Tipo", "Diario");
            SQLCommand.Parameters.AddWithValue("Fecha", DateTime.Today);

            try
            {
                SQLConnection.Open();
                ReaderInfo = SQLCommand.ExecuteReader();
                ListaDeCompras = new Collection<ListaDeCompras>();

                while (ReaderInfo.Read())
                {
                    ListaDeCompras Item = new ListaDeCompras();

                    Item.Codigo_Compra = Convert.ToInt16(ReaderInfo["Codigo_Compra"].ToString());
                    Item.Cantidad_A_Comprar = Convert.ToInt16(ReaderInfo["Cantidad_A_Comprar"].ToString());
                    Item.Codigo_Ingrediente = Convert.ToInt16(ReaderInfo["Codigo_Ingrediente"].ToString());
                    Item.Estado = ReaderInfo["Estado"].ToString();
                    Item.Fecha_Lista_De_Compra = Convert.ToDateTime(ReaderInfo["Fecha_Lista_De_Compra"].ToString());
                    Item.Tipo_De_Lista = ReaderInfo["Tipo_De_Lista"].ToString();
                    Item.Nombre_Ingrediente = HellCook.DataAccess.Ingrediente_AdministradorBaseDeDatos.ObtenerUnIngredientePorCodigo(Item.Codigo_Ingrediente.ToString()).Nombre_Ingrediente;
                    Item.Tipo_De_Medida = HellCook.DataAccess.Ingrediente_AdministradorBaseDeDatos.ObtenerUnIngredientePorCodigo(Item.Codigo_Ingrediente.ToString()).Tipo_Medida;

                    ListaDeCompras.Add(Item);
                }
                if (ListaDeCompras.Count <= 0)
                {
                    ListaDeCompras = null;
                }
            }
            catch (Exception)
            {
                ListaDeCompras = null;
            }
            finally
            {
                if (SQLConnection.State == System.Data.ConnectionState.Open)
                {
                    SQLConnection.Close();
                }
            }
            return (ListaDeCompras);
        }

        public static Collection<ListaDeCompras> ObtenerListaDeCompraSemanal()
        {
            if (String.Equals(DateTime.Today.DayOfWeek.ToString(), "Sunday"))
            {
                Collection<ListaDeCompras> ListaDeCompras = null;
                SqlDataReader ReaderInfo = null;

                SqlConnection SQLConnection;
                SQLConnection = new SqlConnection(PathDataBase);

                SqlCommand SQLCommand = SQLConnection.CreateCommand();
                SQLCommand.CommandText = "SELECT * FROM [ListaDeCompras] WHERE Tipo_De_Lista = @Tipo AND Fecha_Lista_De_Compra = @Fecha AND Estado <> 'Finalizado'";

                SQLCommand.Parameters.AddWithValue("Tipo", "Semanal");
                SQLCommand.Parameters.AddWithValue("Fecha", DateTime.Today);

                try
                {
                    SQLConnection.Open();
                    ReaderInfo = SQLCommand.ExecuteReader();
                    ListaDeCompras = new Collection<ListaDeCompras>();

                    while (ReaderInfo.Read())
                    {
                        ListaDeCompras Item = new ListaDeCompras();

                        Item.Codigo_Compra = Convert.ToInt16(ReaderInfo["Codigo_Compra"].ToString());
                        Item.Cantidad_A_Comprar = Convert.ToInt16(ReaderInfo["Cantidad_A_Comprar"].ToString());
                        Item.Codigo_Ingrediente = Convert.ToInt16(ReaderInfo["Codigo_Ingrediente"].ToString());
                        Item.Estado = ReaderInfo["Estado"].ToString();
                        Item.Fecha_Lista_De_Compra = Convert.ToDateTime(ReaderInfo["Fecha_Lista_De_Compra"].ToString());
                        Item.Tipo_De_Lista = ReaderInfo["Tipo_De_Lista"].ToString();
                        Item.Nombre_Ingrediente = HellCook.DataAccess.Ingrediente_AdministradorBaseDeDatos.ObtenerUnIngredientePorCodigo(Item.Codigo_Ingrediente.ToString()).Nombre_Ingrediente;
                        Item.Tipo_De_Medida = HellCook.DataAccess.Ingrediente_AdministradorBaseDeDatos.ObtenerUnIngredientePorCodigo(Item.Codigo_Ingrediente.ToString()).Tipo_Medida;

                        ListaDeCompras.Add(Item);
                    }
                    if (ListaDeCompras.Count <= 0)
                    {
                        ListaDeCompras = null;
                    }
                }
                catch (Exception)
                {
                    ListaDeCompras = null;
                }
                finally
                {
                    if (SQLConnection.State == System.Data.ConnectionState.Open)
                    {
                        SQLConnection.Close();
                    }
                }
                return (ListaDeCompras);
            }
            else
            {
                return (null);
            }
        }

        public static Collection<ListaDeCompras> ObtenerListaDeCompraMensual()
        {
            if (DateTime.Today.Day == 1)
            {
                Collection<ListaDeCompras> ListaDeCompras = null;
                SqlDataReader ReaderInfo = null;

                SqlConnection SQLConnection;
                SQLConnection = new SqlConnection(PathDataBase);

                SqlCommand SQLCommand = SQLConnection.CreateCommand();
                SQLCommand.CommandText = "SELECT * FROM [ListaDeCompras] WHERE Tipo_De_Lista = @Tipo AND Fecha_Lista_De_Compra = @Fecha AND Estado <> 'Finalizado'";

                SQLCommand.Parameters.AddWithValue("Tipo", "Mensual");
                SQLCommand.Parameters.AddWithValue("Fecha", DateTime.Today);

                try
                {
                    SQLConnection.Open();
                    ReaderInfo = SQLCommand.ExecuteReader();
                    ListaDeCompras = new Collection<ListaDeCompras>();

                    while (ReaderInfo.Read())
                    {
                        ListaDeCompras Item = new ListaDeCompras();

                        Item.Codigo_Compra = Convert.ToInt16(ReaderInfo["Codigo_Compra"].ToString());
                        Item.Cantidad_A_Comprar = Convert.ToInt16(ReaderInfo["Cantidad_A_Comprar"].ToString());
                        Item.Codigo_Ingrediente = Convert.ToInt16(ReaderInfo["Codigo_Ingrediente"].ToString());
                        Item.Estado = ReaderInfo["Estado"].ToString();
                        Item.Fecha_Lista_De_Compra = Convert.ToDateTime(ReaderInfo["Fecha_Lista_De_Compra"].ToString());
                        Item.Tipo_De_Lista = ReaderInfo["Tipo_De_Lista"].ToString();
                        Item.Nombre_Ingrediente = HellCook.DataAccess.Ingrediente_AdministradorBaseDeDatos.ObtenerUnIngredientePorCodigo(Item.Codigo_Ingrediente.ToString()).Nombre_Ingrediente;
                        Item.Tipo_De_Medida = HellCook.DataAccess.Ingrediente_AdministradorBaseDeDatos.ObtenerUnIngredientePorCodigo(Item.Codigo_Ingrediente.ToString()).Tipo_Medida;

                        ListaDeCompras.Add(Item);
                    }
                    if (ListaDeCompras.Count <= 0)
                    {
                        ListaDeCompras = null;
                    }
                }
                catch (Exception)
                {
                    ListaDeCompras = null;
                }
                finally
                {
                    if (SQLConnection.State == System.Data.ConnectionState.Open)
                    {
                        SQLConnection.Close();
                    }
                }
                return (ListaDeCompras);
            }
            else
            {
                return (null);
            }
        }
    }
}
